﻿#pragma once

#include "ddclconfig.h"


enum ddcl_HashType{
    DDHASH_AP = 0,
    DDHASH_RS,
    DDHASH_JS,
    DDHASH_PJW,
    DDHASH_ELF,
    DDHASH_BKDR,
    DDHASH_SDBM,
    DDHASH_DJB,
    DDHASH_DEK,
};

typedef struct tag_ddcl_Map ddcl_Map;
typedef int (* ddcl_MapKeyCmpFn)
    (const void * k1, size_t sz1, const void * k2, size_t sz2);
typedef dduint32 (* ddcl_MapKeyHashFn)(const char * k, size_t sz);


DDCLAPI dduint32
ddcl_hash(const char * k, size_t sz, int type);

DDCLAPI dduint32
ddcl_map_hash(const char * k, size_t sz);

DDCLAPI ddcl_Map *
ddcl_new_map(size_t cap);

DDCLAPI void
ddcl_set_map_cmpfn(ddcl_Map * map, ddcl_MapKeyCmpFn fn);

DDCLAPI void
ddcl_set_map_hashfn(ddcl_Map * map, ddcl_MapKeyHashFn fn);

DDCLAPI void
ddcl_free_map(ddcl_Map * map);

DDCLAPI void
ddcl_expand_map(ddcl_Map * map, size_t cap);

DDCLAPI void
ddcl_put_map (ddcl_Map * map,
        const void * k, size_t ksz, const void * v);

DDCLAPI int
ddcl_del_map (ddcl_Map * map, const void * k, size_t ksz);


DDCLAPI int
ddcl_get_map (ddcl_Map * map,
        const void * k, size_t ksz, const void ** v);

DDCLAPI size_t
ddcl_count_map (ddcl_Map * map);

DDCLAPI void
ddcl_begin_map (ddcl_Map * map);

DDCLAPI int
ddcl_next_map (ddcl_Map * map,
    const void ** k, size_t * ksz, const void ** v);
